Amazon ECSのELB構成パターンまとめ(ALB対応)
ども、大瀧です。
DockerクラスタリングのマネージドサービスであるAmazon ECSにここ数週間で大きなアップデートがあり、AWSのロードバランササービスであるELB(Elastic Load Balancing)との組み合わせ方が大幅に増えました。この記事ではパターンとその使い分けについて解説してみます。
ECSとELBのアップデート概要
ECSでは、ここ数日で以下のアップデートがアナウンスされています。
- Amazon EC2 Container Service Automatic Service Scaling Region Expansion
- Amazon EC2 Container Service Now Integrated with Application Load Balancer to Support Dynamic Ports and Path-based Routing
- Amazon EC2 Container Service Now Supports Networking Modes and Memory Reservation
- Amazon EC2 Container Registry Region Expansion
日本語の情報としては、AWS公式ブログが詳しいです。
今回のELBとの組み合わせとしては、動的ポートとホストネットワークのサポートが関わってくるところです。
一方で、ELBには新しいロードバランサとしてALB(Application Load Balancer)がローンチされました(従来のELBはClassic Load Balancerと呼びます)。
こちらの日本語情報は、手前味噌ですが弊社大栗の記事が参考になります。
ECSのELB構成
ELBからのトラフィック転送にはオーバーレイネットワークなどDocker向けネットワーク構成ではなく、ロードバランサのノードとECSホスト間のネットワークがそのまま利用されます。そのため、ECSのELB構成パターンとしては、ELBの種類とECSホストのポート構成の組み合わせになります。では、パターンごとに見ていきましょう。
パターン1 : 動的ポート&ALB
今回のECS/ELBのアップデートで新たに利用できるようになった組み合わせで、docker run
コマンドの-P
オプションに相当する設定です。ECSエージェントはタスク(Dockerコンテナ)の実行時にコンテナのポートをホストの空いている動的ポートにバインドし、ECSはALBのターゲットグループにホストとその動的ポート番号をセットで登録します。
ECSのタスク定義では、ホストポートを0
に設定します。
ロードバランサにはインスタンス毎に異なるポート番号を設定するため、インスタンスのポート番号を揃える必要のあるClassic Load Balancerには使えません。
以下にメリット/デメリットをまとめます。
- メリット
- 複数のECSタスクを同一ホストで実行できる
- ECSクラスタのインスタンス数よりも多数のECSタスクをECSサービスで実行できる
- デメリット :
- パターン2,3に比べトラブルシューティングの難易度が高い
- Classic Load Balancerが使えない
- ECSタスクを実行するインスタンスが偏ると、ECSクラスタ内でインスタンスのリソース不均衡が起きる
パターン2 : ホストネットワーク
こちらも、今回のECSのアップデートで新たに利用できるようになったものです。docker run
コマンドの--network host
オプションに相当します。ホストのネットワークスタックに直接コンテナのネットワークインターフェースをバインドするため、コンテナでListen/Exportするポートとホストのポートは同一になり、ロードバランサにはホストとコンテナのポート番号が登録されます。
ホストネットワークを利用するためには、ECSのタスク定義で[Network Mode]をHost
に設定します。
ポートの設定では、ホストポートが表示されずコンテナポートのみの入力になります。
では、こちらもメリット/デメリットを。
- メリット :
- パターン3よりもネットワークパフォーマンス上有利
- ELBは、ALBとClassic Load Balancerのどちらも可能
- パターン1よりもトラブルシューティングの難易度は低い
- デメリット :
- 同一のECSタスクは1ホストにつき1タスクまで
- ホストのポート番号が変更できない
パターン3 : 固定ポート
docker run
コマンドの-p
オプションに相当する、従来の構成です。
ホスト側でiptablesによるNAPT処理が入るため、パターン2と比べるとネットワークパフォーマンスの面で不利です。メリット/デメリットは以下のようになります。
- メリット
- コンテナのポート番号とは別にホストのポート番号が指定できる
- ELBは、ALBとClassic Load Balancerのどちらも可能
- パターン1よりもトラブルシューティングの難易度は低い
- デメリット :
- 同一のECSタスクは1ホストにつき1タスクまで
- パターン2よりもネットワークパフォーマンス上不利
まとめ
ECSでのELB構成について、3つのパターンをご紹介しました。 ECSタスク配置の柔軟性から、今後は動的ポート&ALBが主流になっていくと思います。Classic Load Balancerを使う場合はパターン2と3のどちらかの選択になりますが、公開されるポートはELB側で任意に設定出来るため、ホストポートの変更が要件になることはあまりないと考えられます。そのため、パターン2を積極的に利用するのが良いでしょう。
なお、3パターンそれぞれでタスク定義が異なるので、パターン間でタスク定義の流用ができない点に注意しましょう。